技巧56 让镜像变得更小的技巧

我们不妨假设用户拿到一个第三方提供的镜像,而用户希望让镜像变得更小。最简单的办法便是启动一个可以工作的镜像,然后删除一些不必要的文件。

经典的配置管理工具往往不会删除东西,除非显式地声明这样做——取而代之的是,它们会从一个不工作的状态开始,然后往里面添加新的配置和文件。这导致出于一个特定目的制作的系统 千奇百怪 ,而且可能会与一台全新的服务器上运行配置管理工具的结果看上去不太一样,尤其是在配置已经演变了一段时间后。通过Docker友好的分层及轻量的镜像技术,我们可以完成这一流程的反向操作并尝试删除一些东西。

问题

想让镜像变得更小。

解决方案

遵循以下步骤来删除不必要的软件包和文档文件,从而让镜像变得更小。

(1)运行该镜像;

(2)进入容器内部;

(3)删除不必要的文件;

(4)提交容器作为一个新镜像(见技巧15);

(5)扁平化该镜像(见技巧52)。

最后两步在本书前面已经讲过,所以这里仅介绍前面3个步骤。

为了讲解如何利用本技巧,我们打算使用在技巧49里创建的镜像,并尝试使这个镜像变得更小。

先将该镜像作为一个容器运行起来;

docker run -ti --name smaller --entrypoint /bin/bash \
dockerinpractice/log-cleaner

因为这是一个基于Debian的镜像,所以用户可以先看看有哪些可能不需要的软件包,然后删掉它们。执行 dpkg -l | awk '{print $2}', 用户便能拿到系统上已经安装的软件包的清单。

之后,用户可以通过执行 apt-get purge -y packge_name 来清理这些软件包。如果跳出一条吓人的消息警告用户“你要做的操作可能有害”,不妨点击“返回”以继续。

一旦删掉所有能够安全删除的软件包,紧接着就可以执行以下这些命令来清理 apt 的缓存:

apt-get autoremove
apt-get clean

这是一个相对安全地减少镜像里空间占用的办法。

通过删除文档可以进一步节省大量空间。举个例子,执行 rm–rf/usr/share/doc/*/usr/share/man/*/usr/share/info/* 往往可以删除一些大概永远不会用到的大文件。用户还可以通过手动执行 rm 来删除一些不需要的二进制和类库以进一步缩减镜像的大小。

多数还会选择的另一个地方便是/var目录,这里面应该会包含一些临时数据,或者一些对正在运行的程序并非必要的数据。

下面这条命令将会排除所有后缀为.log的文件:

find /var | grep '\.log$' | xargs rm -v

现在会得到一个比之前小得多的镜像,随时可以提交。

讨论

借助这个有点儿手工的流程,用户可以把最初的dockerinpractice/log-cleaner镜像轻松减少至几十MB,而且如果有动力,甚至还可以让它变得更小。记住,由于Docker是分层的,用户将需要按照技巧52里介绍的那样把镜像导出并导入。否则镜像的总大小会包含被删除的文件。

技巧59将会展示一种更为有效(但是也颇有风险)的方法,它可以显著地缩减镜像的大小。

提示

这个例子中介绍的一系列命令在https://github.com/docker-in-practice/log-cleaner-purged维护,而且可以从dockerinpractice/log-cleaner-purged拉取。

results matching ""

    No results matching ""